﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Data;
using Entity;

namespace Business
{
    /// <summary>
    /// Ce service gère tout type de publication sur les murs : statut, commentaires et "J'aime".
    /// </summary>
    public class ActualiteService
    {

        /// <summary>
        /// Retourne toutes les actualités du mur d'un utilisateur.
        /// </summary>
        /// <param name="idutilisateur">L'utilisateur</param>
        /// <returns>La liste des actualités, ou null si aucune actualité</returns>
        public static List<Entity.Actualite> getActualitesDuMur(int idutilisateur)
        {
            List<Actualite> actualites = new List<Actualite>();

            // On recupère tous les amis de l'utilisateur
            List<AmitieUtilisateur> amities = AmitieData.getAmities(idutilisateur, AmitieEtat.AMIS);

            // On créer la liste dans tous les cas
            if (amities == null)
            {
                amities = new List<AmitieUtilisateur>();
            }

            // Les actualités de l'utilisateur lui même doivent se voir sur son propre mur
			// On rajoute alors une relation d'amitié factice avec lui même
            amities.Add(new AmitieUtilisateur(null, new Utilisateur{idutilisateur=idutilisateur}));

            // On boucle sur tous les amis (ainsi que sur lui même)
            foreach (AmitieUtilisateur amitie in amities)
            {
                // Pour chacun on va récupère les actualités
                List<Actualite> actualiteAmis = getActualitesDuProfil(amitie.Utilisateur.idutilisateur);

                // On les ajoutes à la liste dans le bon ordre chronologique
                if (actualiteAmis != null)
                {
                    foreach (Actualite actualite in actualiteAmis)
                    {
                        // On cherche l'index pour insérer l'actualité
                        int pos = 0;
                        bool trouve = false;
                        while (pos < actualites.Count && trouve == false)
                        {
                            // Les actualités les plus récentes en haut de page
                            if (actualites[pos].Statut.date < actualite.Statut.date)
                                trouve = true;
                            else
                                pos++;
                        }

                        // On l'ajoute à la bonne place
                        actualites.Insert(pos, actualite);
                    }
                }
            }

            // On retourne la liste
            if (actualites.Count > 0)
                return actualites;
            else
                return null;
        }

        /// <summary>
        /// Retourne toutes les actualités publiée par un utilisateur.
        /// </summary>
        /// <param name="idutilisateur">L'utilisateur dont on veut lister les actualités</param>
        /// <returns>La liste des actualités, ou null si aucune actualité</returns>
        public static List<Entity.Actualite> getActualitesDuProfil(int idutilisateur)
        {
            List<Actualite> actualites = new List<Actualite>();

            // On récupère tous les statuts de l'utilisateur
            List<StatutUtilisateur> statuts = StatutData.getStatuts(idutilisateur);

            // On boucle sur tous les statuts
            if (statuts != null)
            {
                foreach (StatutUtilisateur statut in statuts)
                {
                    // On récupère les commentaires du statut
                    List<CommentaireUtilisateur> commentaires = CommentaireData.getCommentaires(statut.Statut.idstatut);

                    // On récupère le nombre de "J'aime"
                    int nbAime = AimeData.getNbAime(statut.Statut.idstatut);

                    // On créer l'actualité
                    Actualite actualite = new Actualite();
                    actualite.Statut = statut.Statut;
                    actualite.Utilisateur = statut.Utilisateur;
                    actualite.Commentaires = commentaires;
                    actualite.nbAime = nbAime;

                    // On l'ajoute à la liste
                    actualites.Add(actualite);
                }
            }

            // On retourne la liste
            if(actualites.Count > 0)
                return actualites;
            else
                return null;
        }

        /// <summary>
        /// Ajoute une actualité un l'utilisateur.
        /// </summary>
        /// <param name="idutilisateur">L'utilisateur</param>
        /// <param name="texte">Le contenu de l'actualité</param>
        /// <param name="date">La date de l'actualité</param>
        public static void ajouterActualite(int idutilisateur, String texte, DateTime date)
        {
            StatutData.ajouterStatut(idutilisateur, texte, date);
        }

        /// <summary>
        /// Supprime une actualité.
        /// </summary>
        /// <param name="idstatut">Le statut à supprimer</param>
        public static void supprimerActualite(int idstatut)
        {
            StatutData.supprimerStatut(idstatut);
        }

        /// <summary>
        /// Ajoute un commentaire sur un statut.
        /// </summary>
        /// <param name="idstatut">Le statut</param>
        /// <param name="idutilisateur">L'auteur du commentaire</param>
        /// <param name="texte">Le texte du commentaire</param>
        /// <param name="date">La date du commentaire</param>
        public static void ajouterCommentaire(int idstatut,
            int idutilisateur,
            String texte,
            DateTime date)
        {
            CommentaireData.ajouterCommentaire(idstatut, idutilisateur, texte, date);
        }

        /// <summary>
        /// Ajoute un "J'aime" sur un statut.
        /// </summary>
        /// <param name="idstatut">Le statut</param>
        /// <param name="idutilisateur">L'auteur du "J'aime"</param>
        public static void aimer(int idstatut, int idutilisateur)
        {
            AimeData.ajouterAime(idstatut, idutilisateur);
        }

        /// <summary>
        /// Test si l'utilisateur aime le statut
        /// </summary>
        /// <param name="idstatut">Le statut</param>
        /// <param name="idutilisateur">L'utilisateur</param>
        /// <returns>True si l'utilisateur aime le statut, false sinon</returns>
        public static bool utilisateurAimeStatut(int idstatut, int idutilisateur)
        {
            return AimeData.utilisateurAimeStatut(idstatut, idutilisateur);
        }

        
    }
}
